;int descomprimir_archivo (const char *nomb_arch_entrada, const char *nomb_arch_salida )
%include "macros.mac"
%include "descomprimir_buffer.asm"
%include "cargar_tabla_codigo_desde_buffer.asm"
;;sacr despues
;~extern descomprimir_buffer
;~extern cargar_tabla_codigo_desde_buffer

extern fopen
extern ftell
extern malloc
extern rewind
extern fread
extern fclose
extern printf
extern fwrite
extern fseek
extern fclose
extern free

%define nomb_arch_entrada ebp +8 ;const char *
%define nomb_arch_salida  ebp +12 ;const char *
%define ptr_buffer  ebp -4 
%define tamanio_arch_entrada  ebp -8 
%define dst_size  ebp -12 
%define dst_buffer  ebp -16
%define ptr_tabla_codigo  ebp -20
%define ptr_salida  ebp -24 

%define NULL 0
%define SEEK_END 2
global descomprimir_archivo

section .text

r: db "r",0
w: db "w",0

descomprimir_archivo:
	convencion_C 24

	abrir_archivo

	;copio lo primero del header, el tamanyo original
	mov ecx, [ptr_buffer]
	mov ecx, [ecx]
	mov [dst_size], ecx

	;reservo memoria para el buffer de salida
	push ecx
	call malloc
	add esp, 4
	mov [dst_buffer], eax
	

	;agarro del header la cant de codigos y la long de la codificacion
	mov ecx, [ptr_buffer]
	mov edx, [ecx+4] ; long_codificacion
	mov esi, [ecx+8] ; cant_codigos
	push edx ;me guardo edx para despues
	;cargo la tabla de codigos
	;es "**"..
	lea ecx, [ptr_tabla_codigo]
	push ecx
	push esi
	push dword [ptr_buffer]
	call cargar_tabla_codigo_desde_buffer
	add esp, 8
	pop ecx

	;es "**"..
	mov ecx, [ecx]
	mov [ptr_tabla_codigo],ecx
	pop edx ;recupero el edx q guarde antes
	;descomprimo el buffer
	push ecx
	push dword [dst_size]
	push dword [dst_buffer]
	push dword edx
	push dword [ptr_buffer]
	call descomprimir_buffer
	add esp, 20
	cmp eax, 0
	je near error_descomprimir

	;escribo en salida
	push w
	push dword [nomb_arch_salida]
	call fopen
	add esp, 8
	mov [ptr_salida], eax

	push eax
	push 1
	push dword [dst_size]
	push dword [dst_buffer]
	call fwrite
	add esp, 16

	;cierro y libero memoria
	push dword [ptr_salida]
	call fclose
	add esp,4

	push dword [ptr_buffer]
	call free
	add esp,4

	push dword [dst_buffer]
	call free
	add esp,4

	push dword [ptr_tabla_codigo]
	call free
	add esp,4
	
	mov eax, 1
	fin_desc_arch:
	convencion_C_fin 24
	ret

abrir_error:
	print_error "No se pudo abrir el archivo!"
	jmp fin_desc_arch

error_descomprimir:
	print_error "No se pudo descomprimir!"
	jmp fin_desc_arch
